UK Defibrillator Locations

Author

Adam Dennett

Introduction

This document maps the locations of Automated External Defibrillators (AEDs) across the UK. The data is sourced from The Circuit and contains over 116,000 defibrillator records.

Points are coloured by availability (blue = 24/7, orange = Varied) and shaded by access type (darker = Public, lighter = Restricted).

Load Libraries and Data

library(readxl)
library(sf)
library(dplyr)
library(leaflet)
library(htmltools)

defib <- read_excel("defibrillator_data.xlsx",
                     sheet = "data_extract_2026-02-02")

glimpse(defib)
Rows: 116,027
Columns: 17
$ unique_identifier           <chr> "CD83C127-C680-40C2-AB36-ADEB00B751D3", "F…
$ location_name               <chr> "Aberdeen City Council", "Scottish Courts …
$ address_line1               <chr> "Agricola Street", "Aberdeen Civil Justice…
$ address_line2               <chr> "Milltimber", "Queen Street", "2 St Nichol…
$ address_line3               <chr> "NA", "NA", "NA", "NA", NA, "NA", NA, "NA"…
$ address_city                <chr> "Aberdeen", "Aberdeen", "Aberdeen", "Aberd…
$ address_county              <chr> "NA", "Aberdeenshire", "Aberdeenshire", "A…
$ address_post_code           <chr> "AB1 0JH", "AB10 1AQ", "AB10 1BU", "AB10 1…
$ country                     <chr> "Scotland", "Scotland", "Scotland", "Scotl…
$ ladnm                       <chr> "Aberdeen City", "Aberdeen City", "Aberdee…
$ lsoa21                      <chr> "S01006515", "S01006586", "S01006646", "S0…
$ lsoa21nm                    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ defibrillators_availability <chr> "Varied Access", "Varied Access", "24/7 Ac…
$ defibrillators_access_type  <chr> "Public", "Public", "Public", "Public", "P…
$ lat                         <chr> "57.111269999999998", "57.1488941", "57.14…
$ long                        <dbl> -2.230140, -2.095454, -2.097835, -2.107368…
$ county                      <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…

Clean and Convert to Spatial Data

# Remove rows with missing coordinates
defib_clean <- defib %>%
  filter(!is.na(lat), !is.na(long))

# Convert to sf object
defib_sf <- st_as_sf(defib_clean, coords = c("long", "lat"), crs = 4326)

Assign Colours

# Colour scheme:
#   24/7 Access + Public     -> dark blue   (#08519c)
#   24/7 Access + Restricted -> light blue  (#6baed6)
#   Varied Access + Public   -> dark orange (#d94701)
#   Varied Access + Restricted -> light orange (#fdae6b)

defib_sf <- defib_sf %>%
  mutate(
    point_colour = case_when(
      defibrillators_availability == "24/7 Access" &
        defibrillators_access_type == "Public"     ~ "#08519c",
      defibrillators_availability == "24/7 Access" &
        defibrillators_access_type == "Restricted" ~ "#6baed6",
      defibrillators_availability == "Varied Access" &
        defibrillators_access_type == "Public"     ~ "#d94701",
      defibrillators_availability == "Varied Access" &
        defibrillators_access_type == "Restricted" ~ "#fdae6b",
      TRUE ~ "#999999"
    )
  )

# Summary of colour categories
defib_sf %>%
  st_drop_geometry() %>%
  count(defibrillators_availability, defibrillators_access_type, point_colour,
        name = "count") %>%
  arrange(desc(count))
# A tibble: 4 × 4
  defibrillators_availability defibrillators_access_type point_colour count
  <chr>                       <chr>                      <chr>        <int>
1 24/7 Access                 Public                     #08519c      62618
2 Varied Access               Restricted                 #fdae6b      30046
3 Varied Access               Public                     #d94701      17766
4 24/7 Access                 Restricted                 #6baed6       5597

Interactive Map

leaflet(defib_sf) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addCircleMarkers(
    radius = 3,
    color = ~point_colour,
    stroke = FALSE,
    fillOpacity = 0.6,
    popup = ~paste0(
      "<strong>", location_name, "</strong><br>",
      address_line1, "<br>",
      address_city, " ", address_post_code, "<br>",
      "<em>Availability:</em> ", defibrillators_availability, "<br>",
      "<em>Access:</em> ", defibrillators_access_type
    )
  ) %>%
  addLegend(
    position = "bottomright",
    colors = c("#08519c", "#6baed6", "#d94701", "#fdae6b"),
    labels = c("24/7 — Public", "24/7 — Restricted",
               "Varied — Public", "Varied — Restricted"),
    title = "Availability — Access",
    opacity = 0.8
  )